package cn.tedu.v4;

/**
 * Version 4 消息转发
 * 功能：一个客户端发送给服务器文本，转发至其他客户端
 * 客户端 多线程 ×
 * 服务器 多线程 √  只加一个多线程，替换  消息转发  方案
 * -----------------------------------------------------
 * 多线程并发安全问题：
 * 当多个线程并发操作一个资源时，由于线程切换时间不确定【CPU时间片获取线程时机不确定】，
 * 可能导致代码执行混乱或者进入正确状态，程序出现错误，更严重情况软加瘫痪
 *
 * synchronized 多线程关键字  同步锁
 *
 * 语法情景1：   同步块方式
 * 语法：synchronized（同步监视对象）{
 *
 * }
 * 语法情景2：同步方法方式
 * 语法：public synchronized void  method（）{
 *
 * }
 * 同步机制：可以控制线程的执行顺序，避免线程间切换冲突
 * 异步机制：不控制线程执行顺序，执行两套功能顺序
 *
 * 案例：去WC
 */
public class Thread_syn {public static void main(String[] args) {
    //创建WC
    WC wc=new WC();
    //创建两个线程
    Thread p1=new Thread(()->{
        wc.go();
    });
    Thread p2=new Thread(()->{
       wc.go();
    });
    p1.start();
    p2.start();
}
}



 //创建WC
class  WC{

    public void go() {
        Thread t = Thread.currentThread();
        //获取线程实例：Thread[main,5,main]
        System.out.println(t.getName() + "去厕所..");
        try {  //this  指代当前线程--哪条线程先被CPU时间片选中，先被执行
            synchronized (this) { //监视同步对象：先来线程，立即确定加锁！
                Thread.sleep(5000);
                System.out.println(t.getName() + "找门进去..");
            }
            Thread.sleep(3000);
            System.out.println(t.getName() + "穿裤子走人...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
 }